var express = require("express");
var router = express.Router();
// 导入模型
const {
    Cate,
    sequelize
} = require('../models')

// 导出Op实现复杂的操作 
const {
    Op
} = require('sequelize')

// 导入lodash
const _ = require('lodash')


// 导入验证表单数据的中间件
const expressJoi = require('@escook/express-joi')
    // 导入验证规则
const {
    cate_add_schema,
    cate_update_schema
} = require('../schema/cateValidate')

// 分类添加-表单
router.get('/cates/add', (req, res) => {
    res.render('cate/cate_add.html')
})

// 分类添加-数据入库
router.post('/cates', expressJoi(cate_add_schema), async(req, res) => {
    // 1.数据校验(使用中间件验证)
    // 2.分类名称的唯一性验证
    const result = await Cate.findAll({
        attributes: ['id', 'cate_name'],
        where: {
            cate_name: req.body.cate_name
        }
    })
    if (result.length > 0) {
        return res.cc(400, '分类名称重复')
    }
    // 3.数据库添加
    await Cate.create(req.body)
    return res.cc(200, '添加成功')
})

// 分类添加-分类名称的唯一性校验
router.get('/cates/add/check', async(req, res) => {
    const result = await Cate.findAll({
        attributes: ['id', 'cate_name'],
        where: {
            cate_name: req.query.cate_name.trim()
        }
    })
    if (result.length > 0) {
        return res.cc(400, '分类名称重复')
    }
    return res.cc(200, 'ok')
})

// 分类列表-展示
router.get('/cates', (req, res) => {
    res.render('cate/cate.html')
});
// 分类列表-数据API
router.get('/cates/getCateApi', async(req, res) => {
    // 接收分页的页码和每页显示的记录数
    const page = req.query.page || 1
    const limit = req.query.limit - 0 || 5

    // 获取总记录数
    const data = await Cate.findAll({
        attributes: ['id']
    })
    const count = data.length

    // 分页数据查询
    const pageData = await Cate.findAll({
        attributes: ['id', 'cate_name'],
        offset: (page - 1) * limit,
        limit
    })

    // 构建分页格式的数据
    res.json({
        code: 0,
        msg: 'ok',
        count,
        data: pageData
    })
})

// 分类修改-修改分类名称的API
router.put('/cates/:id/updateCateName', async(req, res) => {
    //  获取要修改的分类id
    const id = req.params.id - 0

    // 判断是否有传递cate_name参数
    if (!(_.has(req.body, 'cate_name'))) {
        return res.cc(400, 'cate_name必填')
    }
    // 接收要修改的数据
    const cate_name = req.body.cate_name.trim()
    if (cate_name.length === 0) {
        return res.cc(400, '分类名称不能为空')
    }
    // 判断：修改后的分类名称不能和数据表中其他的分类名称重复
    const result = await Cate.findAll({
        where: {
            cate_name,
            id: {
                [Op.ne]: id
            }
        }
    })
    if (result.length > 0) {
        return res.cc(400, '分类名称不能重复')
    }
    // 数据库的修改
    const data = await Cate.findByPk(id)
    if (data) {
        await data.update({
            cate_name
        })
        res.cc(200, 'ok')
    } else {
        res.cc(400, '修改失败')
    }

})

// 分类删除-删除分类的API
router.delete('/cates/:id', async(req, res) => {
    //  获取要删除的分类id
    const id = req.params.id - 0
    const row = await Cate.findByPk(id)
    if (row) {
        await row.destroy()
        res.cc(200, 'ok')
    } else {
        res.cc(400, '要删除的数据不存在')
    }
})

// 分类修改---修改的页面
router.get('/cates/:id/edit', async(req, res) => {
    // 接收id
    const id = req.params.id - 0
        // 查询该id对应的数据
    const cate = await Cate.findByPk(id)
    res.render('cate/cate_update.html', {
        cate
    })
})

// 分类修改---分类名称的唯一性验证API
router.get('/cates/update/check', async(req, res) => {
    if (!(_.has(req.query, 'id'))) {
        return res.cc(400, 'id必传')
    }
    if (!(_.has(req.query, 'cate_name'))) {
        return res.cc(400, 'cate_name必传')
    }

    // 判断：修改后的分类名称不能和数据表中其他的分类名称重复
    const result = await Cate.findAll({
        where: {
            cate_name: req.query.cate_name,
            id: {
                [Op.ne]: req.query.id - 0
            }
        }
    })
    if (result.length > 0) {
        return res.cc(400, '分类名称不能重复')
    }
    res.cc(200, 'ok')
})

// 分类修改---接收修改后的数据（分类名称和排序等表单的所有数据）API
router.put('/cates/:id', expressJoi(cate_update_schema), async(req, res) => {
    // 接收数据
    const id = req.params.id - 0
    const cate_name = req.body.cate_name

    // 修改
    const obj = await Cate.findByPk(id)
    if (!obj) {
        return res.cc(400, '要修改的数据不存在')
    }
    // 判断：修改后的分类名称不能和数据表中其他的分类名称重复
    const result = await Cate.findAll({
        where: {
            cate_name,
            id: {
                [Op.ne]: id
            }
        }
    })
    if (result.length > 0) {
        return res.cc(400, '分类名称重复')
    }

    obj.update(req.body)
    return res.cc(200, '修改成功')
})

module.exports = router;